#include "Indexador.h"
#include <sstream>
#include "CompresorDelta.h"
#include "CompresorUnario.h"
#include <fstream>

Indexador::Indexador() {
	//compresor = new CompresorDelta();
}

void Indexador::indexar_terminos(std::fstream *archivo, std::string nom_arch, ArbolTrie *arbol, unsigned int num_doc) {

	std::string termino, termino_anterior, aux_doc;
	std::stringstream ss_doc;
	//std::cout << "Agrupando terminos " << std::endl;
	unsigned int frecuencia = 1, ultima_frec = 1, aux, num_doc_aux;
	archivo->close();
	archivo->open(nom_arch.c_str(), std::fstream::out | std::fstream::in);
	unsigned char *freqDelta = NULL;
	unsigned char *nroDocDelta = NULL;

	//Obtengo el número del documento
	aux_doc = nom_arch.substr(nom_arch.find_first_of('x') + 1,
			nom_arch.find('.') - 1 - nom_arch.find('x'));

	ss_doc << aux_doc.c_str();
	ss_doc >> num_doc_aux;

	CompresorDelta compresor;

	while(getline(*archivo, termino, '\n')) {
		//std::cout << "Leido " << termino << std::endl;
		if (termino_anterior.size() > 0) {
			if (termino_anterior.compare(termino.c_str()) == 0) {
				frecuencia++;
				ultima_frec = frecuencia;
			}
			else {
				//std::cout << "Termino " << termino_anterior << std::endl;
				//std::cout << "num_doc: " << num_doc_aux << std::endl;
				//std::cout << "Frecuencia: " << frecuencia << std::endl;

				compresor.comprimir(num_doc, &nroDocDelta);
				aux = compresor.descompresor(nroDocDelta);

				if(aux != num_doc) {
					std::cout << "Termino: " << termino_anterior << " aux: " << aux << " NumDoc: " << num_doc_aux << std::endl;
					//getchar();
				}

				compresor.comprimir(frecuencia, &freqDelta);
				aux = compresor.descompresor(freqDelta);

				if(aux != frecuencia) {
					std::cout << "Termino: " << termino_anterior << " aux: " << aux << " frec: " << frecuencia << std::endl;
					//getchar();
				}

				arbol->insertarTermino(termino_anterior, nroDocDelta, freqDelta);
				//getchar();
				frecuencia = 1;
				freqDelta = NULL;
				nroDocDelta = NULL;
				//std::cout << std::endl;
			}
		}
		termino_anterior = termino;
	}

	compresor.comprimir(ultima_frec, &freqDelta);
	compresor.comprimir(num_doc, &nroDocDelta);
	arbol->insertarTermino(termino_anterior, nroDocDelta, freqDelta);
	aux = compresor.descompresor(nroDocDelta);
	//std::cout << "Termino ULTIMO: " << termino_anterior << ", Numdoc " << aux << " Frec: " << ultima_frec << std::endl;
}

Indexador::~Indexador() {
	//delete compresor;
}
